package cn.group01.git.service.impl;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.group01.git.common.CodeMsg;
import cn.group01.git.common.ResponseResult;
import cn.group01.git.dto.ImportPageDTO;
import cn.group01.git.entity.Goods;
import cn.group01.git.entity.GoodsImport;
import cn.group01.git.entity.Supplier;
import cn.group01.git.mapper.GoodsMapper;
import cn.group01.git.mapper.ImportMapper;
import cn.group01.git.mapper.SupplierMapper;
import cn.group01.git.service.ImportService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sun.org.apache.regexp.internal.RE;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
 * @description:
 * @author: 黎源
 * @date: 2023/7/13 11:14
 **/
@Service
public class ImportServiceImpl implements ImportService {

    @Autowired
    private ImportMapper importMapper;

    @Autowired
    private SupplierMapper supplierMapper;

    @Autowired
    private GoodsMapper goodsMapper;

    // 入库数据回显操作
    public ResponseResult getList(ImportPageDTO importPageDTO) {
        // 开启分页
        PageHelper.startPage(importPageDTO.getPage(), importPageDTO.getLimit());
        List<GoodsImport> goodsImports = importMapper.getList(importPageDTO.getGoodsName(), importPageDTO.getSupName());
        PageInfo<GoodsImport> pageInfo = new PageInfo<GoodsImport>(goodsImports);
        long total = pageInfo.getTotal();
        return ResponseResult.success(CodeMsg.SUCCESS, goodsImports, total);
    }

    /*
     * 商品入库（进货）
     *   1、供应商是回显界面value里面的值是供应商表中对应的id  根据获取的id查供应商名称
     *   2、修改goodsImport里面的供应商名称、
     *   3、执行添加操作
     *   4、入库表中添加完了以后需要在库存表中查找该商品并添加数量  如果没有该商品那么就在库存表中添加一个该商品
     * */
    public ResponseResult addImport(GoodsImport goodsImport) {
        // 先去找到供应商的名称把goodsImport中的供应商名称换掉
        Supplier supplier = supplierMapper.getByName(goodsImport.getSupName());
        // 修改
        goodsImport.setSupName(supplier.getSupName());

        // 根据goodsName在库存表中查询
        Goods goods = goodsMapper.getByGoodsName(goodsImport.getGoodsName());
        /**
         * 1、首先判断商品在库存表中存不存在
         * 2、存在则需要判断供应商和入库时选择的供应商对不对应
         *      对应则到进行商品数量的添加
         *      不对应则返回该商品供应商选择错误（结束）
         * 3、不存在则在库存中添加商品的一些信息
         * 4、在入库表中添加该条信息
         */
        if (ObjectUtils.isEmpty(goods)){// 3、不存在
            // 添加
            goodsMapper.addGoodsMsg(goodsImport.getSupName(),goodsImport.getGoodsName(),goodsImport.getNumber(),goodsImport.getSpecs());
        }else {// 2、存在
            // 判断供应商是否对应
            if (goods.getSupName().equals(goodsImport.getSupName())){// 对应
                // 将入库的值和库存中的值相加，根据id再更新
                Integer quantity = goods.getQuantity();
                Integer number = goodsImport.getNumber();
                Integer total = quantity+number;
                goodsMapper.updateGoodsNumber(total,goods.getId());
            }else {// 不对应返回
                return ResponseResult.fail(CodeMsg.SUPPLIER_ERROR);
            }
        }
        // 4、添加入库
        // 添加
        importMapper.addImport(goodsImport);
        return ResponseResult.success(CodeMsg.SUCCESS);
    }

    // 入库编辑界面的数据回显
    public GoodsImport getById(Integer id) {
        GoodsImport goodsImport = importMapper.getById(id);
        System.out.println(goodsImport);
        return goodsImport;
    }

    /*
     * 编辑入库信息
     * 1、根据编辑页中的id在入库表中查询当前入库数量
     * 2、根据商品名称去库存表中查询商品对象
     * 3、根据公式 库存数量=库存数量+（修改后的数量-当前入库数量）去修改数据库中的库存数量值
     *
     * */
    public ResponseResult edit(GoodsImport goodsImport) {
        // number当前入库数量
        Integer number = importMapper.getNumberById(goodsImport.getId());
        System.out.println("number = " + number);
        // 查询商品对象
        Goods goods = goodsMapper.getByGoodsName(goodsImport.getGoodsName());
        // 库存数量
        Integer quantity = goods.getQuantity();
        System.out.println("quantity = " + quantity);

        // 修改数量
        Integer number1 = goodsImport.getNumber();
        // 数量为负数 给提示
        if (number1<0){
            return ResponseResult.fail(CodeMsg.NUMBER_ERROR);
        }
        System.out.println("number1 = " + number1);

        Integer result = quantity+(number1-number);
        System.out.println("result = " + result);

        if(result < 0)
            return ResponseResult.fail(CodeMsg.UPDATE_IMPORT_ERROR);

        // 把需要修改的商品库存值和id传到edit方法中
        goodsMapper.edit(result,goods.getId());
        // 编辑入库表中的信息
        importMapper.edit(goodsImport);
        return ResponseResult.success(CodeMsg.SUCCESS);
    }

    /*
     * 删除入库记录  删除一条和批量删除用的都是同一个业务，传过来的都是一个id数组ids 利用循环每个循环遵循如下
     *   1、根据入库记录的id去入库表中查找该条入库记录返回
     *   2、根据商品名称查询库存中的商品对象得到库存数量
     *   3、库存的数量减去删除入库记录的数量
     *   4、去库存表中根据商品名称修改库存中的数量
     *   5、删除入库表中的记录
     * */
    public ResponseResult delete(Integer[] ids) {
        // TODO
        for (Integer id : ids) {
            // 1
            GoodsImport anImport = importMapper.getById(id);
            // 2
            Goods goods = goodsMapper.getByGoodsName(anImport.getGoodsName());
            // 3
            Integer result = goods.getQuantity()- anImport.getNumber();
            if(result < 0){
                return ResponseResult.fail(CodeMsg.OUTPORT_NOT_ENOUGH_FAIL);
            }

            // 4
            goodsMapper.updateGoodsNumber(result,goods.getId());
        }    
        // 5
        importMapper.delete(ids);
        return ResponseResult.success(CodeMsg.DELETE);
    }

    // 批量导出

    public void export(ImportPageDTO importPageDTO, HttpServletResponse response) {
        // 1、先搜索
        List<GoodsImport> goodsImports = importMapper.list(importPageDTO.getSupName(), importPageDTO.getGoodsName());
        ExportParams exportParams = new ExportParams("入库商品信息", "sheet1");
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, GoodsImport.class, goodsImports);
        try {
            //  设置响应的格式  以附件形式打开
            response.setContentType("application/force-download");// 设置强制下载不打开
            response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("入库信息表","UTF-8"));// 设置文件名
            ServletOutputStream outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
